//
// import 'dart:convert';
//
// import 'package:xim/business/model/secret.dart';
// import 'package:xim/business/model/user.dart';
// import 'package:xim/common/util/datetime.dart';
// import 'package:xim/http/apis.dart';
// import 'package:xim/http/ase.dart';
// import 'package:xim/http/rsa.dart';
// import 'package:xim/http/store.dart';
// import 'package:xim/widget/dash_chat_2/dash_chat_2.dart';
//
// const int authMessage = 2;
//
// /// 消息大类型
// enum MessageType {
//
//   chatMessage(typeCode:1),
//
//   authMessage(typeCode:2),
//
//   ;
//
//   final int typeCode;
//
//   const MessageType({required this.typeCode});
//
// }
//
// /// 用户消息类型
// enum AttachmentType {
//   text(typeCode: 1),
//   image(typeCode: 2),
//   video(typeCode: 3),
//   file(typeCode: 4),
//   ;
//   final int typeCode;
//
//   const AttachmentType({required this.typeCode});
//
//   MediaType? toMediaType(){
//     switch(this){
//       case AttachmentType.image:
//         return MediaType.image;
//       case AttachmentType.video:
//         return MediaType.video;
//       case AttachmentType.file:
//         return MediaType.file;
//       default:
//         return null;
//     }
//   }
//
//   static AttachmentType? fromMediaType(MediaType mediaType){
//     if (MediaType.video == mediaType) {
//       return AttachmentType.video;
//     }
//     if (MediaType.image == mediaType) {
//       return AttachmentType.image;
//     }
//     if (MediaType.file == mediaType) {
//       return AttachmentType.file;
//     }
//     return null;
//   }
//
// }
//
// abstract class Message {
//
//   MessageType getMessageType();
//
//   Map<String,dynamic> toJson();
//
//   String toJsonStr(){
//     return json.encode(this);
//   }
//
// }
//
// /// ws 连接认证消息 TODO 位置修改
// class AuthMessage extends Message {
//
//   @override
//   MessageType getMessageType() {
//     return MessageType.authMessage;
//   }
//
//   final String token;
//
//   AuthMessage(this.token);
//
//   @override
//   Map<String,dynamic> toJson() {
//     return {
//       "messageType": getMessageType().typeCode,
//       "token": token
//     };
//   }
//
// }
//
//
// class Attachment {
//   final AttachmentType attachmentType;
//   final String name;
//   final String url;
//   Attachment(this.attachmentType, this.name, this.url);
//
//   Map<String, dynamic> toJson()=>{
//     "attachmentType": attachmentType,
//     "name": name,
//     "url": url,
//   };
//
//   Attachment.fromJson(Map<String, dynamic> json):
//       attachmentType = json["attachmentType"],
//         name = json["name"],
//         url = json["url"]
//   ;
//
//   ChatMedia toChatMedia(){
//     return ChatMedia(
//         url: url,
//         fileName: name,
//         type: attachmentType.toMediaType() ?? MediaType.file
//     );
//   }
//
// }
//
//
// /// 文本消息 [java:ChatMessage] TODO 位置修改
// class UserChatMessage extends Message {
//   final int? id;
//   final int sessionId;
//   final String content;
//   final String senderAccount;
//   final DateTime sendTime;
//   List<Attachment>? attachments;
//   final User userInfoVo;
//   final SessionSecretKeyModel secretKeyVo;
//
//   UserChatMessage({
//     this.id,
//     required this.sessionId,
//     required this.content,
//     required this.senderAccount,
//     required this.sendTime,
//     required this.userInfoVo,
//     this.attachments,
//     required this.secretKeyVo,
//   });
//
//   @override
//   MessageType getMessageType() => MessageType.chatMessage;
//
//   @override
//   Map<String, dynamic> toJson() => {
//     "id": id,
//     "sessionId": sessionId,
//     "messageType": getMessageType().typeCode,
//     "content": content,
//     "senderAccount": senderAccount,
//     "sendTime": sendTime.format("yyyy-MM-dd HH:mm:ss"),
//     "attachments": attachments?.map((e) => e.toJson()).toList(),
//     "user": userInfoVo.toJson(),
//     "secretVersion": secretKeyVo.secretKeyVersion,
//     "secretKeyVo": secretKeyVo.toJson(),
//   };
//
//   UserChatMessage.fromJson(Map<String, dynamic> json):
//         id = json['id'],
//         sessionId = json['sessionId'],
//         content = json['content'],
//         senderAccount = json['senderAccount'],
//         sendTime = DateTime.parse(json['sendTime']),
//         attachments = json['attachments']!=null
//             ? (json['attachments'] as List<dynamic>).map((e) => Attachment.fromJson(e)).toList()
//             : null,
//         userInfoVo = User.fromJson(json['userInfoVo']),
//         secretKeyVo = SessionSecretKeyModel.fromJson(json['secretKeyVo'])
//   ;
//
//   static UserChatMessage fromChatMessage(
//       int sessionId,
//       ChatMessage chatMessage,
//       User sender,
//       SessionSecretKeyModel secretKeyVo,
//       String privateKey) {
//     var attachments = chatMessage.medias?.where((e){
//       var type = AttachmentType.fromMediaType(e.type);
//       if(type==null){
//         logger.w("not support media type ${e.type}");
//         return false;
//       }
//       return true;
//     }).map((e) => Attachment(AttachmentType.fromMediaType(e.type)!, e.fileName, e.url)).toList();
//     // 加密
//     var encryptContent = AES.encryptAes(plainText: chatMessage.text, aesKey: secretKeyVo.decodeSecretKey(privateKey));
//     return UserChatMessage(
//       sessionId: sessionId,
//       content: encryptContent,
//       senderAccount: chatMessage.user.id,
//       sendTime: chatMessage.createdAt,
//       attachments: attachments,
//       userInfoVo: sender,
//       secretKeyVo: secretKeyVo
//     );
//   }
//
//   ChatMessage toChatMessage({String? aesSecretKey, String? privateKey}){
//     // 解密
//     if(privateKey!=null){
//       aesSecretKey = aesSecretKey =decodeByPrivateKeySync(privateKey, secretKeyVo.secretKey);
//     }
//     var decryptContent = AES.decryptAes(encryptedBase64Text: content, aseKey: aesSecretKey??secretKeyVo.secretKey);
//     ChatUser chatUser = userInfoVo.toChatUser();
//    return ChatMessage(
//       user: chatUser,
//       createdAt: sendTime,
//       text: decryptContent,
//       customProperties: {"id": id},
//       medias: attachments?.map((e) => e.toChatMedia()).toList()
//     );
//   }
//
//
// }